home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’94 / [√] Distribution Restricted! / Christian Ruse / Fourier Paper + Apps / nih-image154_source.sea / V1.54 Source / Macros2.p < prev    next >
Text File  |  1993-12-20  |  46KB  |  1,863 lines

  1. unit Macros2;
  2. {Loads macro files into memory and converts them into a token stream}
  3. {that is interpreted by the routines in macros1.p.}
  4.  
  5.  
  6. interface
  7.  
  8.     uses
  9.         QuickDraw, Palettes, PrintTraps, Globals, Utilities, Graphics, File2;{}
  10. {,UMacroDef, UMacroRun;}
  11.  
  12.     procedure LoadMacrosFromFile (fname: str255; RefNum: integer);
  13.     procedure LoadMacros;
  14.  
  15.  
  16. implementation
  17.  
  18.     type
  19.         MacroBufType = packed array[0..MaxMacroFileSize] of char;
  20.         MacroBufPtr = ^MacroBufType;
  21.     var
  22.         PC2: integer;
  23.         MacroBufP: MacroBufPtr;
  24.  
  25.  
  26.     procedure InitSymbolTable;
  27.         var
  28.             i: integer;
  29.     begin
  30.         with MacrosP^ do begin
  31.                 for i := 1 to MaxSymbols do
  32.                     with SymbolTable[i] do begin
  33.                             tType := CommandT;
  34.                             cType := NullC;
  35.                             loc := 0;
  36.                         end;
  37.  
  38.                 with SymbolTable[1] do begin
  39.                         symbol := 'begin       ';
  40.                         tType := BeginT;
  41.                     end;
  42.                 with SymbolTable[2] do begin
  43.                         symbol := 'convolve    ';
  44.                         cType := ConvolveC;
  45.                     end;
  46.                 with SymbolTable[3] do begin
  47.                         symbol := 'fill        ';
  48.                         cType := FillC;
  49.                     end;
  50.                 with SymbolTable[4] do begin
  51.                         symbol := 'selectall   ';
  52.                         cType := SelectC;
  53.                     end;
  54.                 with SymbolTable[5] do begin
  55.                         symbol := 'invert      ';
  56.                         cType := InvertC;
  57.                     end;
  58.                 with SymbolTable[6] do begin
  59.                         symbol := 'killroi     ';
  60.                         cType := KillC;
  61.                     end;
  62.                 with SymbolTable[7] do begin
  63.                         symbol := 'markselectio';
  64.                         cType := MarkC;
  65.                     end;
  66.                 with SymbolTable[8] do begin
  67.                         symbol := 'drawboundary';
  68.                         cType := FrameC;
  69.                     end;
  70.                 with SymbolTable[9] do begin
  71.                         symbol := 'measure     ';
  72.                         cType := MeasureC;
  73.                     end;
  74.                 with SymbolTable[10] do begin
  75.                         symbol := 'fliphorizont';
  76.                         cType := FliphC;
  77.                     end;
  78.                 with SymbolTable[11] do begin
  79.                         symbol := 'analyzeparti';
  80.                         cType := AnalyzeC;
  81.                     end;
  82.                 with SymbolTable[12] do begin
  83.                         symbol := 'nextwindow  ';
  84.                         cType := NextC;
  85.                     end;
  86.                 with SymbolTable[13] do begin
  87.                         symbol := 'paste       ';
  88.                         cType := PasteC;
  89.                     end;
  90.                 with SymbolTAble[14] do begin
  91.                         symbol := 'clear       ';
  92.                         cType := ClearC;
  93.                     end;
  94.                 with SymbolTable[15] do begin
  95.                         symbol := 'copy        ';
  96.                         cType := CopyC;
  97.                     end;
  98.                 with SymbolTable[16] do begin
  99.                         symbol := 'restoreroi  ';
  100.                         cType := RestoreC;
  101.                     end;
  102.                 with SymbolTable[17] do begin
  103.                         symbol := 'setthreshold';
  104.                         cType := ThresholdC;
  105.                     end;
  106.                 with SymbolTable[18] do begin
  107.                         symbol := 'resetgraymap';
  108.                         cType := ResetgmC;
  109.                     end;
  110.                 with SymbolTable[19] do begin
  111.                         symbol := 'makebinary  ';
  112.                         cType := MakeBinC;
  113.                     end;
  114.                 with SymbolTable[20] do begin
  115.                         symbol := 'dither      ';
  116.                         cType := DitherC;
  117.                     end;
  118.                 with SymbolTable[21] do begin
  119.                         symbol := 'smooth      ';
  120.                         cType := SmoothC;
  121.                     end;
  122.                 with SymbolTable[22] do begin
  123.                         symbol := 'scalemath   ';
  124.                         cType := ScaleMathC;
  125.                     end;
  126.                 with SymbolTable[23] do begin
  127.                         symbol := 'sharpen     ';
  128.                         cType := SharpenC;
  129.                     end;
  130.                 with SymbolTable[24] do begin
  131.                         symbol := 'inverty     ';
  132.                         cType := InvertYC;
  133.                     end;
  134.                 with SymbolTable[25] do begin
  135.                         symbol := 'calibrated  ';
  136.                         tType := FunctionT;
  137.                         cType := CalibratedC;
  138.                     end;
  139.                 with SymbolTable[26] do begin
  140.                         symbol := 'divide      ';
  141.                         cType := DivC;
  142.                     end;
  143.                 with SymbolTable[27] do begin
  144.                         symbol := 'redirect    ';
  145.                         cType := RedirectC;
  146.                     end;
  147.                 with SymbolTable[28] do begin
  148.                         symbol := 'getresults  ';
  149.                         cType := GetResultsC;
  150.                     end;
  151.                 with SymbolTable[29] do begin
  152.                         symbol := 'wait        ';
  153.                         cType := WaitC;
  154.                     end;
  155.                 with SymbolTable[30] do begin
  156.                         symbol := 'resetcounter';
  157.                         cType := ResetmC;
  158.                     end;
  159.                 with SymbolTable[31] do begin
  160.                         symbol := 'setdensitysl';
  161.                         cType := SetSliceC;
  162.                     end;
  163.                 with SymbolTable[32] do begin
  164.                         symbol := 'undo        ';
  165.                         cType := UndoC;
  166.                     end;
  167.                 with SymbolTable[33] do begin
  168.                         symbol := 'setforegroun';
  169.                         cType := SetForeC;
  170.                     end;
  171.                 with SymbolTable[34] do begin
  172.                         symbol := 'setbackgroun';
  173.                         cType := SetBackC;
  174.                     end;
  175.                 with SymbolTable[35] do begin
  176.                         symbol := 'scaleandrota';
  177.                         cType := ScaleC;
  178.                     end;
  179.                 with SymbolTable[36] do begin
  180.                         symbol := 'rotateright ';
  181.                         cType := RotateRC;
  182.                     end;
  183.                 with SymbolTable[37] do begin
  184.                         symbol := 'rotateleft  ';
  185.                         cType := RotateLC;
  186.                     end;
  187.                 with SymbolTable[38] do begin
  188.                         symbol := 'traceedges  ';
  189.                         cType := TraceC;
  190.                     end;
  191.                 with SymbolTable[39] do begin
  192.                         symbol := 'multiply    ';
  193.                         cType := MulC;
  194.                     end;
  195.                 with SymbolTable[40] do begin
  196.                         symbol := 'showhistogra';
  197.                         cType := HistoC;
  198.                     end;
  199.                 with SymbolTable[41] do begin
  200.                         symbol := 'enhancecontr';
  201.                         cType := EnhanceC;
  202.                     end;
  203.                 with SymbolTable[42] do begin
  204.                         symbol := 'equalizehist';
  205.                         cType := EqualizeC;
  206.                     end;
  207.                 with SymbolTable[43] do begin
  208.                         symbol := 'erode       ';
  209.                         cType := ErodeC;
  210.                     end;
  211.                 with SymbolTable[44] do begin
  212.                         symbol := 'dilate      ';
  213.                         cType := DilateC;
  214.                     end;
  215.                 with SymbolTable[45] do begin
  216.                         symbol := 'outline     ';
  217.                         cType := OutlineC;
  218.                     end;
  219.                 with SymbolTable[46] do begin
  220.                         symbol := 'skeletonize ';
  221.                         cType := ThinC;
  222.                     end;
  223.                 with SymbolTable[47] do begin
  224.                         symbol := 'addconstant ';
  225.                         cType := AddConstC;
  226.                     end;
  227.                 with SymbolTable[48] do begin
  228.                         symbol := 'reverttosave';
  229.                         cType := RevertC;
  230.                     end;
  231.                 with SymbolTable[49] do begin
  232.                         symbol := 'shadow      ';
  233.                         cType := ShadowC;
  234.                     end;
  235.                 with SymbolTable[50] do begin
  236.                         symbol := 'flipvertical';
  237.                         cType := FlipvC;
  238.                     end;
  239.                 with SymbolTable[51] do begin
  240.                         symbol := 'end         ';
  241.                         tType := EndT;
  242.                     end;
  243.                 with SymbolTable[52] do begin
  244.                         symbol := 'getline     ';
  245.                         cType := GetLineC;
  246.                     end;
  247.                 with SymbolTable[53] do begin
  248.                         symbol := 'var         ';
  249.                         tType := VarT;
  250.                     end;
  251.                 with SymbolTable[54] do begin
  252.                         symbol := 'for         ';
  253.                         tType := ForT;
  254.                     end;
  255.                 with SymbolTable[55] do begin
  256.                         symbol := 'integer     ';
  257.                         tType := IntegerT;
  258.                     end;
  259.                 with SymbolTable[56] do begin
  260.                         symbol := 'to          ';
  261.                         tType := ToT;
  262.                     end;
  263.                 with SymbolTable[57] do begin
  264.                         symbol := 'do          ';
  265.                         tType := DoT;
  266.                     end;
  267.                 with SymbolTable[58] do begin
  268.                         symbol := 'beep        ';
  269.                         cType := BeepC;
  270.                     end;
  271.                 with SymbolTable[59] do begin
  272.                         symbol := 'capture     ';
  273.                         cType := CaptureC;
  274.                     end;
  275.                 with SymbolTable[60] do begin
  276.                         symbol := 'makeroi     ';
  277.                         cType := MakeC;
  278.                     end;
  279.                 with SymbolTable[61] do begin
  280.                         symbol := 'moveroi     ';
  281.                         cType := MoveC;
  282.                     end;
  283.                 with SymbolTable[62] do begin
  284.                         symbol := 'insetroi    ';
  285.                         cType := InsetC;
  286.                     end;
  287.                 with SymbolTable[63] do begin
  288.                         symbol := 'moveto      ';
  289.                         cType := MoveToC;
  290.                     end;
  291.                 with SymbolTable[64] do begin
  292.                         symbol := 'drawtext    ';
  293.                         cType := DrawTextC;
  294.                     end;
  295.                 with SymbolTable[65] do begin
  296.                         symbol := 'setfont     ';
  297.                         cType := SetFontC;
  298.                     end;
  299.                 with SymbolTable[66] do begin
  300.                         symbol := 'setfontsize ';
  301.                         cType := SetFontSizeC;
  302.                     end;
  303.                 with SymbolTable[67] do begin
  304.                         symbol := 'settext     ';
  305.                         cType := SetTextC;
  306.                     end;
  307.                 with SymbolTable[68] do begin
  308.                         symbol := 'drawnumber  ';
  309.                         cType := DrawNumC;
  310.                     end;
  311.                 with SymbolTable[69] do begin
  312.                         symbol := 'or          ';
  313.                         tType := orOp;
  314.                     end;
  315.                 with SymbolTable[70] do begin
  316.                         symbol := 'and         ';
  317.                         tType := andOp;
  318.                     end;
  319.                 with SymbolTable[71] do begin
  320.                         symbol := 'div         ';
  321.                         tType := IntDivOp;
  322.                     end;
  323.                 with SymbolTable[72] do begin
  324.                         symbol := 'mod         ';
  325.                         tType := modOp;
  326.                     end;
  327.                 with SymbolTable[73] do begin
  328.                         symbol := 'getpicsize  ';
  329.                         cType := GetPicSizeC;
  330.                     end;
  331.                 with SymbolTable[74] do begin
  332.                         symbol := 'putmessage  ';
  333.                         cType := PutMsgC;
  334.                     end;
  335.                 with SymbolTable[75] do begin
  336.                         symbol := 'exit        ';
  337.                         cType := ExitC;
  338.                     end;
  339.                 with SymbolTable[76] do begin
  340.                         symbol := 'if          ';
  341.                         tType := ifT;
  342.                     end;
  343.                 with SymbolTable[77] do begin
  344.                         symbol := 'then        ';
  345.                         tType := thenT;
  346.                     end;
  347.                 with SymbolTable[78] do begin
  348.                         symbol := 'else        ';
  349.                         tType := elseT;
  350.                     end;
  351.                 with SymbolTable[79] do begin
  352.                         symbol := 'while       ';
  353.                         tType := whileT;
  354.                     end;
  355.                 with SymbolTable[80] do begin
  356.                         symbol := 'repeat      ';
  357.                         tType := repeatT;
  358.                     end;
  359.                 with SymbolTable[81] do begin
  360.                         symbol := 'until       ';
  361.                         tType := untilT;
  362.                     end;
  363.                 with SymbolTable[82] do begin
  364.                         symbol := 'not         ';
  365.                         tType := NotOp;
  366.                     end;
  367.                 with SymbolTable[83] do begin
  368.                         symbol := 'getroi      ';
  369.                         cType := GetRoiC;
  370.                     end;
  371.                 with SymbolTable[84] do begin
  372.                         symbol := 'real        ';
  373.                         tType := RealT;
  374.                     end;
  375.                 with SymbolTable[85] do begin
  376.                         symbol := 'trunc       ';
  377.                         tType := FunctionT;
  378.                         cType := TruncC;
  379.                     end;
  380.                 with SymbolTable[86] do begin
  381.                         symbol := 'round       ';
  382.                         tType := FunctionT;
  383.                         cType := RoundC;
  384.                     end;
  385.                 with SymbolTable[87] do begin
  386.                         symbol := 'getnumber   ';
  387.                         tType := FunctionT;
  388.                         cType := GetNumC;
  389.                     end;
  390.                 with SymbolTable[88] do begin
  391.                         symbol := 'nop         ';
  392.                         cType := NopC;
  393.                     end;
  394.                 with SymbolTable[89] do begin
  395.                         symbol := 'random      ';
  396.                         tType := FunctionT;
  397.                         cType := RandomC;
  398.                     end;
  399.                 with SymbolTable[90] do begin
  400.                         symbol := 'makeovalroi ';
  401.                         cType := MakeOvalC;
  402.                     end;
  403.                 with SymbolTable[91] do begin
  404.                         symbol := 'drawscale   ';
  405.                         cType := DrawScaleC;
  406.                     end;
  407.                 with SymbolTable[92] do begin
  408.                         symbol := 'setpalette  ';
  409.                         cType := SetPaletteC;
  410.                     end;
  411.                 with SymbolTable[93] do begin
  412.                         symbol := 'makenewwindo';
  413.                         cType := MakeNewC;
  414.                     end;
  415.                 with SymbolTable[94] do begin
  416.                         symbol := 'getpixel    ';
  417.                         tType := FunctionT;
  418.                         cType := GetPixelC;
  419.                     end;
  420.                 with SymbolTable[95] do begin
  421.                         symbol := 'button      ';
  422.                         tType := FunctionT;
  423.                         cType := ButtonC;
  424.                     end;
  425.                 with SymbolTable[96] do begin
  426.                         symbol := 'odd         ';
  427.                         tType := FunctionT;
  428.                         cType := oddC;
  429.                     end;
  430.                 with SymbolTable[97] do begin
  431.                         symbol := 'abs         ';
  432.                         tType := FunctionT;
  433.                         cType := absC;
  434.                     end;
  435.                 with SymbolTable[98] do begin
  436.                         symbol := 'sqrt        ';
  437.                         tType := FunctionT;
  438.                         cType := sqrtC;
  439.                     end;
  440.                 with SymbolTable[99] do begin
  441.                         symbol := 'sin         ';
  442.                         tType := FunctionT;
  443.                         cType := sinC;
  444.                     end;
  445.                 with SymbolTable[100] do begin
  446.                         symbol := 'cos         ';
  447.                         tType := FunctionT;
  448.                         cType := cosC;
  449.                     end;
  450.                 with SymbolTable[101] do begin
  451.                         symbol := 'exp         ';
  452.                         tType := FunctionT;
  453.                         cType := expC;
  454.                     end;
  455.                 with SymbolTable[102] do begin
  456.                         symbol := 'ln          ';
  457.                         tType := FunctionT;
  458.                         cType := lnC;
  459.                     end;
  460.                 with SymbolTable[103] do begin
  461.                         symbol := 'arctan      ';
  462.                         tType := FunctionT;
  463.                         cType := arctanC;
  464.                     end;
  465.                 with SymbolTable[104] do begin
  466.                         symbol := 'sqr         ';
  467.                         tType := FunctionT;
  468.                         cType := sqrC;
  469.                     end;
  470.                 with SymbolTable[105] do begin
  471.                         symbol := 'macro       ';
  472.                         tType := MacroT;
  473.                     end;
  474.                 with SymbolTable[106] do begin
  475.                         symbol := 'procedure   ';
  476.                         tType := ProcIdT;
  477.                     end;
  478.                 with SymbolTable[107] do begin
  479.                         symbol := 'open        ';
  480.                         cType := openC;
  481.                     end;
  482.                 with SymbolTable[108] do begin
  483.                         symbol := 'setimport   ';
  484.                         cType := SetImportC;
  485.                     end;
  486.                 with SymbolTable[109] do begin
  487.                         symbol := 'import      ';
  488.                         cType := ImportC;
  489.                     end;
  490.                 with SymbolTable[110] do begin
  491.                         symbol := 'setimportmin';
  492.                         cType := SetMinMaxC;
  493.                     end;
  494.                 with SymbolTable[111] do begin
  495.                         symbol := 'setcustom   ';
  496.                         cType := SetCustomC;
  497.                     end;
  498.                 with SymbolTable[112] do begin
  499.                         symbol := 'npics       ';
  500.                         tType := FunctionT;
  501.                         cType := nPicsC;
  502.                     end;
  503.                 with SymbolTable[113] do begin
  504.                         symbol := 'selectpic   ';
  505.                         cType := SelectPicC;
  506.                     end;
  507.                 with SymbolTable[114] do begin
  508.                         symbol := 'setpicname  ';
  509.                         cType := SetPicNameC;
  510.                     end;
  511.                 with SymbolTable[115] do begin
  512.                         symbol := 'applylut    ';
  513.                         cType := ApplyLutC;
  514.                     end;
  515.                 with SymbolTable[116] do begin
  516.                         symbol := 'multiplybyco';
  517.                         cType := MulConstC;
  518.                     end;
  519.                 with SymbolTable[117] do begin
  520.                         symbol := 'setnewsize  ';
  521.                         cType := SetSizeC;
  522.                     end;
  523.                 with SymbolTable[118] do begin
  524.                         symbol := 'save        ';
  525.                         cType := SaveC;
  526.                     end;
  527.                 with SymbolTable[119] do begin
  528.                         symbol := 'saveall     ';
  529.                         cType := SaveAllC;
  530.                     end;
  531.                 with SymbolTable[120] do begin
  532.                         symbol := 'saveas      ';
  533.                         cType := SaveAsC;
  534.                     end;
  535.                 with SymbolTable[121] do begin
  536.                         symbol := 'copyresults ';
  537.                         cType := CopyResultsC;
  538.                     end;
  539.                 with SymbolTable[122] do begin
  540.                         symbol := 'boolean     ';
  541.                         tType := BooleanT;
  542.                     end;
  543.                 with SymbolTable[123] do begin
  544.                         symbol := 'true        ';
  545.                         tType := TrueT;
  546.                     end;
  547.                 with SymbolTable[124] do begin
  548.                         symbol := 'false       ';
  549.                         tType := FalseT;
  550.                     end;
  551.                 with SymbolTable[125] do begin
  552.                         symbol := 'close       ';
  553.                         cType := CloseC;
  554.                     end;
  555.                 with SymbolTable[126] do begin
  556.                         symbol := 'dispose     ';
  557.                         cType := DisposeC;
  558.                     end;
  559.                 with SymbolTable[127] do begin
  560.                         symbol := 'disposeall  ';
  561.                         cType := DisposeAllC;
  562.                     end;
  563.                 with SymbolTable[128] do begin
  564.                         symbol := 'duplicate   ';
  565.                         cType := DupC;
  566.                     end;
  567.                 with SymbolTable[129] do begin
  568.                         symbol := 'getinfo     ';
  569.                         cType := GetInfoC;
  570.                     end;
  571.                 with SymbolTable[130] do begin
  572.                         symbol := 'print       ';
  573.                         cType := PrintC;
  574.                     end;
  575.                 with SymbolTable[131] do begin
  576.                         symbol := 'lineto      ';
  577.                         cType := LineToC;
  578.                     end;
  579.                 with SymbolTable[132] do begin
  580.                         symbol := 'setplotlabel';
  581.                         cType := SetLabelsC;
  582.                     end;
  583.                 with SymbolTable[133] do begin
  584.                         symbol := 'setplotscale';
  585.                         cType := SetPlotScaleC;
  586.                     end;
  587.                 with SymbolTable[134] do begin
  588.                         symbol := 'setplotsize ';
  589.                         cType := SetDimC;
  590.                     end;
  591.                 with SymbolTable[135] do begin
  592.                         symbol := 'setscaling  ';
  593.                         cType := ScalingOptionsC;
  594.                     end;
  595.                 with SymbolTable[136] do begin
  596.                         symbol := 'columnaverag';
  597.                         cType := ColumnC;
  598.                     end;
  599.                 with SymbolTable[137] do begin
  600.                         symbol := 'setchannel  ';
  601.                         cType := ChannelC;
  602.                     end;
  603.                 with SymbolTable[138] do begin
  604.                         symbol := 'showpastecon';
  605.                         cType := ShowPasteC;
  606.                     end;
  607.                 with SymbolTable[139] do begin
  608.                         symbol := 'setoption   ';
  609.                         cType := SetOptionC;
  610.                     end;
  611.                 with SymbolTable[140] do begin
  612.                         symbol := 'doand       ';
  613.                         cType := AndC;
  614.                     end;
  615.                 with SymbolTable[141] do begin
  616.                         symbol := 'door        ';
  617.                         cType := OrC;
  618.                     end;
  619.                 with SymbolTable[142] do begin
  620.                         symbol := 'doxor       ';
  621.                         cType := XorC;
  622.                     end;
  623.                 with SymbolTable[143] do begin
  624.                         symbol := 'doblend     ';
  625.                         cType := BlendC;
  626.                     end;
  627.                 with SymbolTable[144] do begin
  628.                         symbol := 'doreplace   ';
  629.                         cType := ReplaceC;
  630.                     end;
  631.                 with SymbolTable[145] do begin
  632.                         symbol := 'add         ';
  633.                         cType := AddC;
  634.                     end;
  635.                 with SymbolTable[146] do begin
  636.                         symbol := 'subtract    ';
  637.                         cType := SubC;
  638.                     end;
  639.                 with SymbolTable[147] do begin
  640.                         symbol := 'setlinewidth';
  641.                         cType := SetWidthC;
  642.                     end;
  643.                 with SymbolTable[148] do begin
  644.                         symbol := 'showresults ';
  645.                         cType := ShowResultsC;
  646.                     end;
  647.                 with SymbolTable[149] do begin
  648.                         symbol := 'startcapturi';
  649.                         cType := StartC;
  650.                     end;
  651.                 with SymbolTable[150] do begin
  652.                         symbol := 'getrow      ';
  653.                         cType := GetRowC;
  654.                     end;
  655.                 with SymbolTable[151] do begin
  656.                         symbol := 'putrow      ';
  657.                         cType := PutRowC;
  658.                     end;
  659.                 with SymbolTable[152] do begin
  660.                         symbol := 'getcolumn   ';
  661.                         cType := GetColumnC;
  662.                     end;
  663.                 with SymbolTable[153] do begin
  664.                         symbol := 'putcolumn   ';
  665.                         cType := PutColumnC;
  666.                     end;
  667.                 with SymbolTable[154] do begin
  668.                         symbol := 'allsamesize ';
  669.                         tType := FunctionT;
  670.                         cType := SameSizeC;
  671.                     end;
  672.                 with SymbolTable[155] do begin
  673.                         symbol := 'cvalue      ';
  674.                         tType := FunctionT;
  675.                         cType := cValueC;
  676.                     end;
  677.                 with SymbolTable[156] do begin
  678.                         symbol := 'plotxyz     ';
  679.                         cType := PlotXYZC;
  680.                     end;
  681.                 with SymbolTable[157] do begin
  682.                         symbol := 'includeinter';
  683.                         cType := IncludeC;
  684.                     end;
  685.                 with SymbolTable[158] do begin
  686.                         symbol := 'wandautomeas';
  687.                         cType := AutoC;
  688.                     end;
  689.                 with SymbolTable[159] do begin
  690.                         symbol := 'labelparticl';
  691.                         cType := LabelC;
  692.                     end;
  693.                 with SymbolTable[160] do begin
  694.                         symbol := 'outlineparti';
  695.                         cType := OutlineParticlesC;
  696.                     end;
  697.                 with SymbolTable[161] do begin
  698.                         symbol := 'ignorepartic';
  699.                         cType := IgnoreC;
  700.                     end;
  701.                 with SymbolTable[162] do begin
  702.                         symbol := 'adjustareas ';
  703.                         cType := AdjustC;
  704.                     end;
  705.                 with SymbolTable[163] do begin
  706.                         symbol := 'setparticles';
  707.                         cType := SetParticleSizeC;
  708.                     end;
  709.                 with SymbolTable[164] do begin
  710.                         symbol := 'setprecision';
  711.                         cType := SetPrecisionC;
  712.                     end;
  713.                 with SymbolTable[165] do begin
  714.                         symbol := 'imagemath   ';
  715.                         cType := ImageMathC;
  716.                     end;
  717.                 with SymbolTable[166] do begin
  718.                         symbol := 'pastelive   ';
  719.                         cType := PasteLiveC;
  720.                     end;
  721.                 with SymbolTable[167] do begin
  722.                         symbol := 'pidexists   ';
  723.                         tType := FunctionT;
  724.                         cType := PidExistsC;
  725.                     end;
  726.                 with SymbolTable[168] do begin
  727.                         symbol := 'pos         ';
  728.                         tType := FunctionT;
  729.                         cType := PosC;
  730.                     end;
  731. {Unused entries}
  732.                 with SymbolTable[169] do begin
  733.                         symbol := 'xeasuremode ';
  734.                         cType := NopC;
  735.                     end;
  736.                 with SymbolTable[170] do begin
  737.                         symbol := 'xeasureperim';
  738.                         cType := NopC;
  739.                     end;
  740.                 with SymbolTable[171] do begin
  741.                         symbol := 'xeasuremajor';
  742.                         cType := NopC;
  743.                     end;
  744.                 with SymbolTable[172] do begin
  745.                         symbol := 'xeasureminor';
  746.                         cType := NopC;
  747.                     end;
  748.                 with SymbolTable[173] do begin
  749.                         symbol := 'xeasureangle';
  750.                         cType := NopC;
  751.                     end;
  752.                 with SymbolTable[174] do begin
  753.                         symbol := 'xeasureinteg';
  754.                         cType := NopC;
  755.                     end;
  756. {End unused entries}
  757.                 with SymbolTable[175] do begin
  758.                         symbol := 'putpixel    ';
  759.                         cType := PutPixelC;
  760.                     end;
  761.                 with SymbolTable[176] do begin
  762.                         symbol := 'choosepic   ';
  763.                         cType := ChoosePicC;
  764.                     end;
  765.                 with SymbolTable[177] do begin
  766.                         symbol := 'write       ';
  767.                         cType := WriteC;
  768.                     end;
  769.                 with SymbolTable[178] do begin
  770.                         symbol := 'writeln     ';
  771.                         cType := WritelnC;
  772.                     end;
  773.                 with SymbolTable[179] do begin
  774.                         symbol := 'scaleselecti';
  775.                         cType := ScaleSelectionC;
  776.                     end;
  777.                 with SymbolTable[180] do begin
  778.                         symbol := 'picnumber   ';
  779.                         tType := FunctionT;
  780.                         cType := PicNumC;
  781.                     end;
  782.                 with SymbolTable[181] do begin
  783.                         symbol := 'export      ';
  784.                         cType := ExportC;
  785.                     end;
  786.                 with SymbolTable[182] do begin
  787.                         symbol := 'reducenoise ';
  788.                         cType := ReduceC;
  789.                     end;
  790.                 with SymbolTable[183] do begin
  791.                         symbol := 'changevalues';
  792.                         cType := ChangeC;
  793.                     end;
  794.                 with SymbolTable[184] do begin
  795.                         symbol := 'histogram   ';
  796.                         tType := ArrayT;
  797.                         cType := HistogramC;
  798.                     end;
  799.                 with SymbolTable[185] do begin
  800.                         symbol := 'scaleconvolu';
  801.                         cType := ScaleConvolutionsC;
  802.                     end;
  803.                 with SymbolTable[186] do begin
  804.                         symbol := 'rarea       ';
  805.                         tType := ArrayT;
  806.                         cType := rAreaC;
  807.                     end;
  808.                 with SymbolTable[187] do begin
  809.                         symbol := 'rmean       ';
  810.                         tType := ArrayT;
  811.                         cType := rMeanC;
  812.                     end;
  813.                 with SymbolTable[188] do begin
  814.                         symbol := 'rx          ';
  815.                         tType := ArrayT;
  816.                         cType := rXC;
  817.                     end;
  818.                 with SymbolTable[189] do begin
  819.                         symbol := 'ry          ';
  820.                         tType := ArrayT;
  821.                         cType := rYC;
  822.                     end;
  823.                 with SymbolTable[190] do begin
  824.                         symbol := 'rmin        ';
  825.                         tType := ArrayT;
  826.                         cType := rMinC;
  827.                     end;
  828.                 with SymbolTable[191] do begin
  829.                         symbol := 'rmax        ';
  830.                         tType := ArrayT;
  831.                         cType := rMaxC;
  832.                     end;
  833.                 with SymbolTable[192] do begin
  834.                         symbol := 'rcount      ';
  835.                         tType := FunctionT;
  836.                         cType := rCountC;
  837.                     end;
  838.                 with SymbolTable[193] do begin
  839.                         symbol := 'updateresult';
  840.                         cType := UpdateResultsC;
  841.                     end;
  842.                 with SymbolTable[194] do begin
  843.                         symbol := 'stopcapturin';
  844.                         cType := StopC;
  845.                     end;
  846.                 with SymbolTable[195] do begin
  847.                         symbol := 'tilewindows ';
  848.                         cType := TileC;
  849.                     end;
  850.                 with SymbolTable[196] do begin
  851.                         symbol := 'rlength     ';
  852.                         tType := ArrayT;
  853.                         cType := rLengthC;
  854.                     end;
  855.                 with SymbolTable[197] do begin
  856.                         symbol := 'rmajor      ';
  857.                         tType := ArrayT;
  858.                         cType := rMajorC;
  859.                     end;
  860.                 with SymbolTable[198] do begin
  861.                         symbol := 'rminor      ';
  862.                         tType := ArrayT;
  863.                         cType := rMinorC;
  864.                     end;
  865.                 with SymbolTable[199] do begin
  866.                         symbol := 'rangle      ';
  867.                         tType := ArrayT;
  868.                         cType := rAngleC;
  869.                     end;
  870.                 with SymbolTable[200] do begin
  871.                         symbol := 'setmajorlabe';
  872.                         cType := SetMajorC;
  873.                     end;
  874.                 with SymbolTable[201] do begin
  875.                         symbol := 'setminorlabe';
  876.                         cType := SetMinorC;
  877.                     end;
  878.                 with SymbolTable[202] do begin
  879.                         symbol := 'getmouse    ';
  880.                         cType := GetMouseC;
  881.                     end;
  882.                 with SymbolTable[203] do begin
  883.                         symbol := 'slicenumber ';
  884.                         tType := FunctionT;
  885.                         cType := GetSliceC;
  886.                     end;
  887.                 with SymbolTable[204] do begin
  888.                         symbol := 'nslices     ';
  889.                         tType := FunctionT;
  890.                         cType := nSlicesC;
  891.                     end;
  892.                 with SymbolTable[205] do begin
  893.                         symbol := 'selectslice ';
  894.                         cType := SelectSliceC;
  895.                     end;
  896.                 with SymbolTable[206] do begin
  897.                         symbol := 'addslice    ';
  898.                         cType := AddSliceC;
  899.                     end;
  900.                 with SymbolTable[207] do begin
  901.                         symbol := 'deleteslice ';
  902.                         cType := DeleteSliceC;
  903.                     end;
  904.                 with SymbolTable[208] do begin
  905.                         symbol := 'makenewstack';
  906.                         cType := MakeStackC;
  907.                     end;
  908.                 with SymbolTable[209] do begin
  909.                         symbol := 'averageframe';
  910.                         cType := AverageFramesC;
  911.                     end;
  912.                 with SymbolTable[210] do begin
  913.                         symbol := 'waitfortrigg';
  914.                         cType := TriggerC;
  915.                     end;
  916.                 with SymbolTable[211] do begin
  917.                         symbol := 'docopy      ';
  918.                         cType := CopyModeC;
  919.                     end;
  920.                 with SymbolTable[212] do begin
  921.                         symbol := 'reslice     ';
  922.                         cType := ResliceC;
  923.                     end;
  924.                 with SymbolTable[213] do begin
  925.                         symbol := 'makelineroi ';
  926.                         cType := MakeLineC;
  927.                     end;
  928.                 with SymbolTable[214] do begin
  929.                         symbol := 'plotprofile ';
  930.                         cType := PlotProfileC;
  931.                     end;
  932.                 with SymbolTable[215] do begin
  933.                         symbol := 'gettime     ';
  934.                         cType := GetTimeC;
  935.                     end;
  936.                 with SymbolTable[216] do begin
  937.                         symbol := 'setscale    ';
  938.                         cType := SetScaleC;
  939.                     end;
  940.                 with SymbolTable[217] do begin
  941.                         symbol := 'savestate   ';
  942.                         cType := SaveStateC;
  943.                     end;
  944.                 with SymbolTable[218] do begin
  945.                         symbol := 'restorestate';
  946.                         cType := RestoreStateC;
  947.                     end;
  948.                 with SymbolTable[219] do begin
  949.                         symbol := 'setcounter  ';
  950.                         cType := SetCounterC;
  951.                     end;
  952.                 with SymbolTable[220] do begin
  953.                         symbol := 'redlut      ';
  954.                         tType := ArrayT;
  955.                         cType := RedLutC;
  956.                     end;
  957.                 with SymbolTable[221] do begin
  958.                         symbol := 'greenlut    ';
  959.                         tType := ArrayT;
  960.                         cType := GreenLutC;
  961.                     end;
  962.                 with SymbolTable[222] do begin
  963.                         symbol := 'bluelut     ';
  964.                         tType := ArrayT;
  965.                         cType := BlueLutC;
  966.                     end;
  967.                 with SymbolTable[223] do begin
  968.                         symbol := 'updatelut   ';
  969.                         cType := UpdateLutC;
  970.                     end;
  971.                 with SymbolTable[224] do begin
  972.                         symbol := 'showmessage ';
  973.                         cType := ShowMsgC;
  974.                     end;
  975.                 with SymbolTable[225] do begin
  976.                         symbol := 'setbinarycou';
  977.                         cType := SetCountC;
  978.                     end;
  979.                 with SymbolTable[226] do begin
  980.                         symbol := 'rstddev     ';
  981.                         tType := ArrayT;
  982.                         cType := rStdDevC;
  983.                     end;
  984.                 with SymbolTable[227] do begin
  985.                         symbol := 'propagatelut';
  986.                         cType := PropagateLutC;
  987.                     end;
  988.                 with SymbolTable[228] do begin
  989.                         symbol := 'chooseslice ';
  990.                         cType := ChooseSliceC;
  991.                     end;
  992.                 with SymbolTable[229] do begin
  993.                         symbol := 'setslicespac';
  994.                         cType := SetSpacingC;
  995.                     end;
  996.                 with SymbolTable[230] do begin
  997.                         symbol := 'getslicespac';
  998.                         tType := FunctionT;
  999.                         cType := GetSpacingC;
  1000.                     end;
  1001.                 with SymbolTable[231] do begin
  1002.                         symbol := 'linebuffer  ';
  1003.                         tType := ArrayT;
  1004.                         cType := BufferC;
  1005.                     end;
  1006.                 with SymbolTable[232] do begin
  1007.                         symbol := 'ruser1      ';
  1008.                         tType := ArrayT;
  1009.                         cType := rUser1C;
  1010.                     end;
  1011.                 with SymbolTable[233] do begin
  1012.                         symbol := 'ruser2      ';
  1013.                         tType := ArrayT;
  1014.                         cType := rUser2C;
  1015.                     end;
  1016.                 with SymbolTable[234] do begin
  1017.                         symbol := 'propagateden';
  1018.                         cType := PropagateDensityC;
  1019.                     end;
  1020.                 with SymbolTable[235] do begin
  1021.                         symbol := 'propagatespa';
  1022.                         cType := PropagateSpatialC;
  1023.                     end;
  1024.                 with SymbolTable[236] do begin
  1025.                         symbol := 'setoptions  ';
  1026.                         cType := SetOptionsC;
  1027.                     end;
  1028.                 with SymbolTable[237] do begin
  1029.                         symbol := 'requiresvers';
  1030.                         cType := RequiresC;
  1031.                     end;
  1032.                 with SymbolTable[238] do begin
  1033.                         symbol := 'getplotdata ';
  1034.                         cType := GetPlotDataC;
  1035.                     end;
  1036.                 with SymbolTable[239] do begin
  1037.                         symbol := 'plotdata    ';
  1038.                         tType := ArrayT;
  1039.                         cType := PlotDataC;
  1040.                     end;
  1041.                 with SymbolTable[240] do begin
  1042.                         symbol := 'setuser1labe';
  1043.                         cType := SetUser1C;
  1044.                     end;
  1045.                 with SymbolTable[241] do begin
  1046.                         symbol := 'setuser2labe';
  1047.                         cType := SetUser2C;
  1048.                     end;
  1049.                 with SymbolTable[242] do begin
  1050.                         symbol := 'subtractback';
  1051.                         cType := SubtractBackgroundC;
  1052.                     end;
  1053.                 with SymbolTable[243] do begin
  1054.                         symbol := 'autothreshol';
  1055.                         cType := AutoThresholdC;
  1056.                     end;
  1057.                 with SymbolTable[244] do begin
  1058.                         symbol := 'setexport   ';
  1059.                         cType := SetExportC;
  1060.                     end;
  1061.                 with SymbolTable[245] do begin
  1062.                         symbol := 'movewindow  ';
  1063.                         cType := MoveWindowC;
  1064.                     end;
  1065.                 with SymbolTable[246] do begin
  1066.                         symbol := 'usercode    ';
  1067.                         cType := UserCodeC;
  1068.                     end;
  1069.                 with SymbolTable[247] do begin
  1070.                         symbol := 'invertlut   ';
  1071.                         cType := InvertLutC;
  1072.                     end;
  1073.                 with SymbolTable[248] do begin
  1074.                         symbol := 'xcoordinates';
  1075.                         tType := ArrayT;
  1076.                         cType := xCoordinatesC;
  1077.                     end;
  1078.                 with SymbolTable[249] do begin
  1079.                         symbol := 'ycoordinates';
  1080.                         tType := ArrayT;
  1081.                         cType := yCoordinatesC;
  1082.                     end;
  1083.                 with SymbolTable[250] do begin
  1084.                         symbol := 'ncoordinates';
  1085.                         tType := FunctionT;
  1086.                         cType := nCoordinatesC;
  1087.                     end;
  1088.                 with SymbolTable[251] do begin
  1089.                         symbol := 'string      ';
  1090.                         tType := StringT;
  1091.                     end;
  1092.                 with SymbolTable[252] do begin
  1093.                         symbol := 'getstring   ';
  1094.                         tType := StringFunctionT;
  1095.                         cType := GetStringC;
  1096.                     end;
  1097.                 with SymbolTable[253] do begin
  1098.                         symbol := 'openserial  ';
  1099.                         cType := OpenSerialC;
  1100.                     end;
  1101.                 with SymbolTable[254] do begin
  1102.                         symbol := 'getserial   ';
  1103.                         tType := StringFunctionT;
  1104.                         cType := GetSerialC;
  1105.                     end;
  1106.                 with SymbolTable[255] do begin
  1107.                         symbol := 'putserial   ';
  1108.                         cType := PutSerialC;
  1109.                     end;
  1110.                 with SymbolTable[256] do begin
  1111.                         symbol := 'chr         ';
  1112.                         tType := StringFunctionT;
  1113.                         cType := ChrC;
  1114.                     end;
  1115.                 with SymbolTable[257] do begin
  1116.                         symbol := 'ord         ';
  1117.                         tType := FunctionT;
  1118.                         cType := OrdC;
  1119.                     end;
  1120.                 with SymbolTable[258] do begin
  1121.                         symbol := 'setcursor   ';
  1122.                         cType := SetCursorC;
  1123.                     end;
  1124.                 with SymbolTable[259] do begin
  1125.                         symbol := 'tickcount   ';
  1126.                         tType := FunctionT;
  1127.                         cType := TickCountC;
  1128.                     end;
  1129.                 with SymbolTable[260] do begin
  1130.                         symbol := 'concat      ';
  1131.                         tType := StringFunctionT;
  1132.                         cType := ConcatC;
  1133.                     end;
  1134.                 with SymbolTable[261] do begin
  1135.                         symbol := 'setvideo    ';
  1136.                         cType := SetVideoC;
  1137.                     end;
  1138.                 with SymbolTable[262] do begin
  1139.                         symbol := 'stringtonum ';
  1140.                         tType := FunctionT;
  1141.                         cType := StringToNumC;
  1142.                     end;
  1143.                 with SymbolTable[263] do begin
  1144.                         symbol := 'acquire     ';
  1145.                         cType := AcquireC;
  1146.                     end;
  1147.                 with SymbolTable[264] do begin
  1148.                         symbol := 'undobuffersi';
  1149.                         tType := FunctionT;
  1150.                         cType := UndoSizeC;
  1151.                     end;
  1152.                 with SymbolTable[265] do begin
  1153.                         symbol := 'scion       ';
  1154.                         tType := ArrayT;
  1155.                         cType := ScionC;
  1156.                     end;
  1157.                 with SymbolTable[266] do begin
  1158.                         symbol := 'filter      ';
  1159.                         cType := FilterC;
  1160.                     end;
  1161.                 with SymbolTable[267] do begin
  1162.                         symbol := 'photomode   ';
  1163.                         cType := PhotoModeC;
  1164.                     end;
  1165.                 with SymbolTable[268] do begin
  1166.                         symbol := 'rgbtoindexed';
  1167.                         cType := RGBToIndexedC;
  1168.                     end;
  1169.                 with SymbolTable[269] do begin
  1170.                         symbol := 'surfaceplot ';
  1171.                         cType := SurfacePlotC;
  1172.                     end;
  1173.                 with SymbolTable[270] do begin
  1174.                         symbol := 'selectwindow';
  1175.                         cType := SelectWindowC;
  1176.                     end;
  1177.                 with SymbolTable[271] do begin
  1178.                         symbol := 'newtextwindo';
  1179.                         cType := NewTextWindowC;
  1180.                     end;
  1181.                 with SymbolTable[272] do begin
  1182.                         symbol := 'capturecolor';
  1183.                         cType := CaptureColorC;
  1184.                     end;
  1185.                 with SymbolTable[273] do begin
  1186.                         symbol := 'getthreshold';
  1187.                         cType := GetThresholdC;
  1188.                     end;
  1189.                 with SymbolTable[274] do begin
  1190.                         symbol := 'averageslice';
  1191.                         cType := AverageSlicesC;
  1192.                     end;
  1193.                 with SymbolTable[275] do begin
  1194.                         symbol := 'bitand      ';
  1195.                         tType := FunctionT;
  1196.                         cType := BitAndC;
  1197.                     end;
  1198.                 with SymbolTable[276] do begin
  1199.                         symbol := 'bitor       ';
  1200.                         tType := FunctionT;
  1201.                         cType := BitOrC;
  1202.                     end;
  1203.                 with SymbolTable[277] do begin
  1204.                         symbol := 'sortpalette ';
  1205.                         cType := SortPaletteC;
  1206.                     end;
  1207.                 with SymbolTable[278] do begin
  1208.                         symbol := 'pidnumber   ';
  1209.                         tType := FunctionT;
  1210.                         cType := PidNumC;
  1211.                     end;
  1212.                 with SymbolTable[279] do begin
  1213.                         symbol := 'project     ';
  1214.                         cType := ProjectC;
  1215.                     end;
  1216.                 with SymbolTable[280] do begin
  1217.                         symbol := 'windowtitle ';
  1218.                         tType := StringFunctionT;
  1219.                         cType := WindowTitleC;
  1220.                     end;
  1221.             end; {with}
  1222.         nSymbols := 280; {Must be subscript of last predefined symbol}
  1223.    {Note: there are currently 6 unused entries in the table. Search for 'Unused' to find them.}
  1224.     end;
  1225.  
  1226.  
  1227.     procedure DeallocateStrings2 (first, last: integer);
  1228.         var
  1229.             i: integer;
  1230.     begin
  1231.         with MacrosP^ do begin
  1232.                 for i := first to last do begin
  1233.                         if Stack[i].StringH <> nil then begin
  1234.                                 DisposHandle(handle(Stack[i].StringH));
  1235.                                 Stack[i].StringH := nil;
  1236.                             end;
  1237.                     end;
  1238.             end;
  1239.     end;
  1240.  
  1241.  
  1242.     procedure LTMacroError (str: str255);
  1243.   {Report load-time errors}
  1244.         var
  1245.             str2: str255;
  1246.             i, count: integer;
  1247.     begin
  1248.         if token = DoneT then
  1249.             exit(LTMacroError);
  1250.         if TopOfStack > 0 then
  1251.             DeallocateStrings2(1, TopOfStack);
  1252.         PutMessage(concat(str, ' in line ', long2str(MacroLineNumber), ' of macro file.'));
  1253.         Token := DoneT;
  1254.     end;
  1255.  
  1256.  
  1257.     procedure LookupIdentifier;
  1258.         var
  1259.             i: integer;
  1260.     begin
  1261.         with MacrosP^ do
  1262.             for i := 1 to nSymbols do begin
  1263.                     if TokenSymbol = SymbolTable[i].symbol then
  1264.                         with SymbolTable[i] do begin
  1265.                                 token := tType;
  1266.                                 MacroCommand := cType;
  1267.                                 TokenLoc := loc;
  1268.                                 SymbolTableLoc := i;
  1269.                                 exit(LookupIdentifier);
  1270.                             end;
  1271.                 end; {for}
  1272.         token := UnknownIdentifier;
  1273.     end;
  1274.  
  1275.  
  1276.     procedure GetToken;
  1277.         var
  1278.             c: char;
  1279.             SymbolLength: integer;
  1280.     begin
  1281.         if token = DoneT then
  1282.             exit(GetToken);
  1283.         SavePC := PC;
  1284.         SaveToken := token;
  1285.         while not (MacroBufP^[pc] in ['a'..'z', '0'..'9', '(', ')', ',', '''', '+', '-', '*', '/', ':', ';', '=', '.', '>', '<', '[', ']', '|']) do begin  {skip white space}
  1286.                 if MacroBufP^[pc] = cr then
  1287.                     MacroBufP^[pc] := '|'
  1288.                 else
  1289.                     pc := pc + 1;
  1290.                 if pc > EndMacros then begin
  1291.                         Token := DoneT;
  1292.                         exit(GetToken);
  1293.                     end;
  1294.             end;
  1295.         c := MacroBufP^[pc];
  1296.         case c of
  1297.             'a'..'z':  begin
  1298.                     TokenSymbol := BlankSymbol;
  1299.                     SymbolLength := 0;
  1300.                     while MacroBufP^[pc] in ['a'..'z', '0'..'9'] do begin
  1301.                             SymbolLength := SymbolLength + 1;
  1302.                             if SymbolLength <= SymbolSize then
  1303.                                 TokenSymbol[SymbolLength] := MacroBufP^[pc];
  1304.                             pc := pc + 1;
  1305.                             if pc > EndMacros then begin
  1306.                                     Token := DoneT;
  1307.                                     exit(GetToken);
  1308.                                 end;
  1309.                         end;
  1310.                     Token := identifier;
  1311.                     LookupIdentifier;
  1312.                     exit(GetToken);
  1313.                 end;
  1314.             '0'..'9', '.':  begin
  1315.                     TokenStr := '';
  1316.                     while MacroBufP^[pc] in ['0'..'9', '.'] do begin
  1317.                             TokenStr := concat(TokenStr, c);
  1318.                             pc := pc + 1;
  1319.                             c := MacroBufP^[pc];
  1320.                             if pc > EndMacros then begin
  1321.                                     Token := DoneT;
  1322.                                     exit(GetToken);
  1323.                                 end;
  1324.                         end;
  1325.                     Token := NumericLiteral;
  1326.                     if MacroBufP^[pc] in ['a'..'z'] then
  1327.                         LTMacroError('Operator expected');
  1328.                     exit(GetToken);
  1329.                 end;
  1330.             '(':  begin
  1331.                     Token := LeftParen;
  1332.                     pc := pc + 1;
  1333.                 end;
  1334.             ')':  begin
  1335.                     Token := RightParen;
  1336.                     pc := pc + 1;
  1337.                 end;
  1338.             '[':  begin
  1339.                     Token := LeftBracket;
  1340.                     pc := pc + 1;
  1341.                 end;
  1342.             ']':  begin
  1343.                     Token := RightBracket;
  1344.                     pc := pc + 1;
  1345.                 end;
  1346.             ',':  begin
  1347.                     Token := comma;
  1348.                     pc := pc + 1;
  1349.                 end;
  1350.             ':': 
  1351.                 if MacroBufP^[pc + 1] = '=' then begin
  1352.                         Token := AssignOp;
  1353.                         pc := pc + 2;
  1354.                     end
  1355.                 else begin
  1356.                         Token := colon;
  1357.                         pc := pc + 1;
  1358.                     end;
  1359.             ';':  begin
  1360.                     Token := SemiColon;
  1361.                     pc := pc + 1;
  1362.                 end;
  1363.             '+':  begin
  1364.                     Token := PlusOp;
  1365.                     pc := pc + 1;
  1366.                 end;
  1367.             '-':  begin
  1368.                     Token := MinusOp;
  1369.                     pc := pc + 1;
  1370.                 end;
  1371.             '*':  begin
  1372.                     Token := MulOp;
  1373.                     pc := pc + 1;
  1374.                 end;
  1375.             '/':  begin
  1376.                     Token := DivOp;
  1377.                     pc := pc + 1;
  1378.                 end;
  1379.             '''':  begin
  1380.                     TokenStr := '';
  1381.                     pc := pc + 1;
  1382.                     while MacroBufP^[pc] <> '''' do begin
  1383.                             TokenStr := concat(TokenStr, MacroBufP^[pc]);
  1384.                             pc := pc + 1;
  1385.                             if pc > EndMacros then begin
  1386.                                     Token := DoneT;
  1387.                                     exit(GetToken);
  1388.                                 end;
  1389.                         end;
  1390.                     pc := pc + 1;
  1391.                     Token := StringLiteral;
  1392.                 end;
  1393.             '=':  begin
  1394.                     Token := eqOp;
  1395.                     pc := pc + 1;
  1396.                 end;
  1397.             '<':  begin
  1398.                     pc := pc + 1;
  1399.                     if MacroBufP^[pc] = '>' then begin
  1400.                             token := neOp;
  1401.                             pc := pc + 1;
  1402.                         end
  1403.                     else if MacroBufP^[pc] = '=' then begin
  1404.                             token := leOp;
  1405.                             pc := pc + 1;
  1406.                         end
  1407.                     else
  1408.                         token := ltOp;
  1409.                 end;
  1410.             '>':  begin
  1411.                     pc := pc + 1;
  1412.                     if MacroBufP^[pc] = '=' then begin
  1413.                             token := geOp;
  1414.                             pc := pc + 1;
  1415.                         end
  1416.                     else
  1417.                         token := gtOp;
  1418.                 end;
  1419.             '|':  begin
  1420.                     Token := NewLineT;
  1421.                     MacroLineNumber := MacroLineNumber + 1;
  1422.                     pc := pc + 1;
  1423.                 end;
  1424.             otherwise begin
  1425.                     token := NullT;
  1426.                     beep;
  1427.                 end;
  1428.         end; {case}
  1429.     end;
  1430.  
  1431.  
  1432.     procedure AddProcedure;
  1433.     begin
  1434.         GetToken;
  1435.         if token <> UnknownIdentifier then begin
  1436.                 LTMacroError('Procedure name missing or previously defined');
  1437.                 exit(AddProcedure);
  1438.             end;
  1439.         if nSymbols >= MaxSymbols then begin
  1440.                 LTMacroError('Symbol table overflow');
  1441.                 exit(AddProcedure);
  1442.             end;
  1443.         nSymbols := nSymbols + 1;
  1444.         nProcedures := nProcedures + 1;
  1445.         with MacrosP^, MacrosP^.SymbolTable[nSymbols] do begin
  1446.                 symbol := TokenSymbol;
  1447.                 tType := procedureT;
  1448.                 cType := NullC;
  1449.                 if MacroBufP^[pc] = ';' then
  1450.                     pc := pc + 1;
  1451.                 loc := pc2 + 1;
  1452.             end;
  1453.     end;
  1454.  
  1455.  
  1456.     procedure AddIdentifier;
  1457.     begin
  1458.         if nSymbols >= MaxSymbols then begin
  1459.                 LTMacroError('Symbol table overflow');
  1460.                 exit(AddIdentifier);
  1461.             end;
  1462.         nSymbols := nSymbols + 1;
  1463.         with MacrosP^, MacrosP^.SymbolTable[nSymbols] do begin
  1464.                 symbol := TokenSymbol;
  1465.                 tType := Identifier;
  1466.                 cType := NullC;
  1467.                 loc := pc2;
  1468.             end;
  1469.     end;
  1470.  
  1471.  
  1472.     procedure GetGDToken;
  1473.     begin
  1474.         GetToken;
  1475.         while token = NewLineT do
  1476.             GetToken;
  1477.     end;
  1478.  
  1479.  
  1480.     procedure DoGlobalDeclaration;
  1481.         var
  1482.             SaveStackLoc, StackLoc: integer;
  1483.     begin
  1484.         SaveStackLoc := TopOfStack;
  1485.         while (token = UnknownIdentifier) or (token = Identifier) do begin
  1486.                 if Token = UnknownIdentifier then begin
  1487.                         AddIdentifier;
  1488.                         SymbolTableLoc := nSymbols;
  1489.                         token := identifier;
  1490.                     end;
  1491.                 if TopOfStack >= MaxStackSize then begin
  1492.                         LTMacroError(StackOverflow);
  1493.                         exit(DoGlobalDeclaration);
  1494.                     end;
  1495.                 TopOfStack := TopOfStack + 1;
  1496.                 nGlobals := nGlobals + 1;
  1497.                 with MacrosP^.stack[TopOfStack] do begin
  1498.                         SymbolTableIndex := SymbolTableLoc;
  1499.                         value := 0.0;
  1500.                         StringH := nil;
  1501.                     end;
  1502.                 GetGDToken;
  1503.                 if token = comma then
  1504.                     GetGDToken;
  1505.             end; {while}
  1506.         if token <> colon then
  1507.             LTMacroError('":" expected');
  1508.         GetGDToken;
  1509.         if (token <> IntegerT) and (token <> RealT) and (token <> BooleanT) and (token <> StringT) then
  1510.             LTMacroError('"integer", "real", "boolean" or "string" expected');
  1511.         for StackLoc := SaveStackLoc + 1 to TopOfStack do
  1512.             with macrosP^.stack[StackLoc] do
  1513.                 case token of
  1514.                     IntegerT: 
  1515.                         vType := IntVar;
  1516.                     RealT: 
  1517.                         vType := RealVar;
  1518.                     BooleanT: 
  1519.                         vType := BooleanVar;
  1520.                     StringT:  begin
  1521.                             vType := StringVar;
  1522.                             StringH := str255H(NewHandle(SizeOf(str255)));
  1523.                             if StringH = nil then begin
  1524.                                     LTMacroError('Out of memory');
  1525.                                     Token := DoneT
  1526.                                 end
  1527.                             else
  1528.                                 StringH^^ := 'Global String';
  1529.                         end;
  1530.                     otherwise
  1531.                 end;
  1532.         GetGDToken;
  1533.         if Token = SemiColon then
  1534.             GetGDToken;
  1535.     end;
  1536.  
  1537.  
  1538.     procedure PutTokenBack2;
  1539.     begin
  1540.         if token <> DoneT then begin
  1541.                 pc := SavePC;
  1542.                 token := SaveToken;
  1543.             end;
  1544.     end;
  1545.  
  1546.  
  1547.     procedure DoGlobalDeclarations;
  1548.     begin
  1549.         GetGDToken;
  1550.         while ((token = UnknownIdentifier) or (token = Identifier)) and (Token <> DoneT) do
  1551.             DoGlobalDeclaration;
  1552.         PutTokenBack2;
  1553.     end;
  1554.  
  1555.  
  1556.     function PreScan1: boolean;
  1557.    {Converts the macro file to lowercase and removes comments.}
  1558.         var
  1559.             inString, inComment: boolean;
  1560.             c: char;
  1561.             i, StartComment: integer;
  1562.  
  1563.         function LineNumber: integer;
  1564.             var
  1565.                 i, n: integer;
  1566.         begin
  1567.             n := 1;
  1568.             for i := 0 to pc do
  1569.                 if MacroBufP^[i] = cr then
  1570.                     n := n + 1;
  1571.             LineNumber := n;
  1572.         end;
  1573.  
  1574.     begin
  1575.         PreScan1 := false;
  1576.         inString := false;
  1577.         inComment := false;
  1578.         for i := 0 to EndMacros do begin
  1579.                 c := MacroBufP^[i];
  1580.                 if inString and (c = cr) then begin
  1581.                         pc := i;
  1582.                         PutMessage(concat('The quoted string in line ', long2str(LineNumber), ' of the macro file is not terminated.'));
  1583.                         exit(PreScan1);
  1584.                     end;
  1585.                 if (not InString) and (c = '{') then begin
  1586.                         InComment := true;
  1587.                         StartComment := i;
  1588.                     end;
  1589.                 if inComment then begin
  1590.                         if (c = '{') and (i <> StartComment) then begin
  1591.                                 PutMessage('Comments cannot be nested.');
  1592.                                 exit(PreScan1);
  1593.                             end;
  1594.                         if c = '}' then
  1595.                             inComment := false;
  1596.                         if c <> cr then
  1597.                             MacroBufP^[i] := ' ';
  1598.                     end
  1599.                 else begin
  1600.                         if (c = '‘') or (c = '`') then begin
  1601.                                 pc := i;
  1602.                                 PutMessage(concat('Bad quote("‘" or "`") in line ', long2str(LineNumber), ' of macro file.'));
  1603.                                 exit(PreScan1);
  1604.                             end;
  1605.                         if c = '''' then
  1606.                             inString := not inString;
  1607.                         if (c >= 'A') and (c <= 'Z') and not inString then
  1608.                             MacroBufP^[i] := chr(ord(c) + 32);
  1609.                     end;
  1610.             end;
  1611.         if inComment then begin
  1612.                 pc := StartComment;
  1613.                 PutMessage(concat('The comment starting in line ', long2str(LineNumber), ' of the macro file is not terminated.'))
  1614.             end
  1615.         else
  1616.             PreScan1 := true;
  1617.     end;
  1618.  
  1619.  
  1620.     procedure StoreInteger (i: integer);
  1621.     begin
  1622.         with macrosP^ do begin
  1623.                 pc2 := pc2 + 1;
  1624.                 macros[pc2] := chr(band(bsr(i, 8), $ff));
  1625.                 pc2 := pc2 + 1;
  1626.                 macros[pc2] := chr(band(i, $ff));
  1627.             end;
  1628.     end;
  1629.  
  1630.  
  1631.     procedure StoreReal (r: real);
  1632.         var
  1633.             i: LongInt;
  1634.     begin
  1635.         i := LongInt(r);
  1636.         with macrosP^ do begin
  1637.                 pc2 := pc2 + 1;
  1638.                 macros[pc2] := chr(band(bsr(i, 24), $ff));
  1639.                 pc2 := pc2 + 1;
  1640.                 macros[pc2] := chr(band(bsr(i, 16), $ff));
  1641.                 pc2 := pc2 + 1;
  1642.                 macros[pc2] := chr(band(bsr(i, 8), $ff));
  1643.                 pc2 := pc2 + 1;
  1644.                 macros[pc2] := chr(band(i, $ff));
  1645.             end;
  1646.     end;
  1647.  
  1648.  
  1649.     procedure StoreString;
  1650.         var
  1651.             i: integer;
  1652.     begin
  1653.         with macrosP^ do begin
  1654.                 for i := 1 to length(TokenStr) do begin
  1655.                         pc2 := pc2 + 1;
  1656.                         macros[pc2] := TokenStr[i];
  1657.                     end;
  1658.                 pc2 := pc2 + 1;
  1659.                 macros[pc2] := chr(0);
  1660.             end;
  1661.     end;
  1662.  
  1663.  
  1664.     procedure AddMenuItem;
  1665.         var
  1666.             i, fkey: integer;
  1667.             c, key: char;
  1668.     begin
  1669.         with MacrosP^ do begin
  1670.                 GetToken;
  1671.                 pc2 := pc2 + 1;
  1672.                 macros[pc2] := chr(ord(token));
  1673.                 if token <> StringLiteral then begin
  1674.                         LTMacroError('Macro command name not found');
  1675.                         exit(AddMenuItem);
  1676.                     end;
  1677.                 StoreString;
  1678.                 if nMacros < MaxMacros then begin
  1679.                         AppendMenu(SpecialMenuH, TokenStr);
  1680.                         nMacros := nMacros + 1
  1681.                     end
  1682.                 else
  1683.                     PutMessage('Too many macros.');
  1684.                 if macros[pc] = ';' then
  1685.                     pc := pc + 1;
  1686.                 MacroStart[nMacros] := pc2 + 1;
  1687.                 i := pos('[', TokenStr);
  1688.                 if i > 0 then begin {Assign a key to macro?}
  1689.                         i := i + 1;
  1690.                         key := TokenStr[i];
  1691.                         if (key >= 'A') and (key <= 'Z') then
  1692.                             key := chr(ord(key) + 32);
  1693.                         MacroKey[nMacros] := key;
  1694.                         if (key = 'f') and (TokenStr[i + 1] in ['1'..'9']) then begin {Function Key?}
  1695.                                 fkey := ord(TokenStr[i + 1]) - ord('0');
  1696.                                 if TokenStr[i + 2] in ['0'..'5'] then
  1697.                                     fkey := fkey * 10 + ord(TokenStr[i + 2]) - ord('0');
  1698.                                 if (fkey >= 1) and (fkey <= 15) then
  1699.                                     MacroKey[nMacros] := chr(ord('A') + fkey - 1);
  1700.                             end; {Function key?}
  1701.                     end;
  1702.             end; {with}
  1703.     end;
  1704.  
  1705.  
  1706.     procedure PreScan2;
  1707.   {Converts the macro file to a token stream. Some tokens are followed by an argument.}
  1708.   {<StringT> is followd by a null terminated string, <NumericLiteral> by a real(4 byte) number,}
  1709.   {<Identifier> and <ProcedureT> by a symbol table location(2 byte integer), and}
  1710.   {<CommandT>, <FunctionT>, <StringFunctionT>, and <ArrayT> by a 2 byte ID.}
  1711.   {UserCommandT, UserFuncT, UserStrFuncT are also followed by a 2 byte ID.}
  1712.         var
  1713.             i: integer;
  1714.     begin
  1715.         with MacrosP^ do begin
  1716.                 if nMacros > 0 then
  1717.                     for i := 1 to nMacros do begin
  1718.                             DelMenuItem(SpecialMenuH, FirstMacroItem);
  1719.                             MacroKey[i] := chr(0);
  1720.                         end;
  1721.                 nMacros := 0;
  1722.                 nProcedures := 0;
  1723.                 nGlobals := 0;
  1724.                 if TopOfStack > 0 then
  1725.                     DeallocateStrings2(1, TopOfStack);
  1726.                 TopOfStack := 0;
  1727.                 MacroOrProcName := BlankSymbol;
  1728.                 pc := 0;
  1729.                 pc2 := 0;
  1730.                 token := NullT;
  1731.                 SymbolTableLoc := 0;
  1732.                 MacroLineNumber := 1;
  1733.                 repeat
  1734.                     GetToken;
  1735.                     macros[pc2] := chr(ord(token));
  1736.                     case token of
  1737.                         StringLiteral: 
  1738.                             StoreString;
  1739.                         NumericLiteral: 
  1740.                             StoreReal(StringToReal(TokenStr));
  1741.                         MacroT:  begin
  1742.                                 AddMenuItem;
  1743.                                 if token = DoneT then
  1744.                                     exit(PreScan2);
  1745.                             end;
  1746.                         Identifier, ProcedureT: 
  1747.                             StoreInteger(SymbolTableLoc);
  1748.                         UnknownIdentifier:  begin
  1749.                                 AddIdentifier;
  1750.                                 if token = DoneT then
  1751.                                     exit(PreScan2);
  1752.                                 macros[pc2] := chr(ord(Identifier));
  1753.                                 StoreInteger(nSymbols);
  1754.                             end;
  1755.                         ProcIDT:  begin
  1756.                                 AddProcedure;
  1757.                                 if token = DoneT then
  1758.                                     exit(PreScan2);
  1759.                             end;
  1760.                         VarT: 
  1761.                             if (nMacros = 0) and (nProcedures = 0) then begin
  1762.                                     DoGlobalDeclarations;
  1763.                                     if token = DoneT then
  1764.                                         exit(PreScan2);
  1765.                                 end;
  1766.                         CommandT, FunctionT, StringFunctionT, ArrayT, UserCommandT, UserFuncT, UserStrFuncT: 
  1767.                             StoreInteger(ord(MacroCommand));
  1768.                         otherwise
  1769.                             ;
  1770.                     end; {case}
  1771.                     pc2 := pc2 + 1;
  1772.                     if pc2 > (MaxMacroSize - 256) then begin
  1773.                             if nMacros > 0 then
  1774.                                 DelMenuItem(SpecialMenuH, FirstMacroItem + nMacros - 1);
  1775.                             PutMessage('Unable to load all the macros because file is too large.');
  1776.                             exit(PreScan2);
  1777.                         end;
  1778.                 until token = DoneT;
  1779.                 EndMacros := pc2 - 1;
  1780.             end;
  1781.         if nMacros = 0 then
  1782.             PutMessage('No macros found.');
  1783.     end;
  1784.  
  1785.  
  1786.     procedure LoadMacros2;
  1787.     begin
  1788.         ShowWatch;
  1789.         if not PreScan1 then begin
  1790.                 DisposPtr(ptr(MacroBufP));
  1791.                 exit(LoadMacros2);
  1792.             end;
  1793.         InitSymbolTable;
  1794.         PreScan2;
  1795.         DisposPtr(ptr(MacroBufP));
  1796.         CurrentX := 20;
  1797.         CurrentY := 20;
  1798.         SaveForeground := -1;
  1799.     end;
  1800.  
  1801.  
  1802.     procedure LoadMacrosFromFile (fname: str255; RefNum: integer);
  1803.         var
  1804.             err: OSErr;
  1805.             FileSize: LongInt;
  1806.             f: integer;
  1807.     begin
  1808.         err := FSOpen(fname, RefNum, f);
  1809.         err := GetEOF(f, FileSize);
  1810.         if FileSize > MaxMacroFileSize then begin
  1811.                 err := fsclose(f);
  1812.                 PutMessage('Macro file is too large.');
  1813.                 exit(LoadMacrosFromFile);
  1814.             end;
  1815.         MacroBufP := MacroBufPtr(NewPtr(FileSize));
  1816.         if MacroBufP = nil then begin
  1817.                 err := fsclose(f);
  1818.                 PutMessage('Not enough memory to load macro file.');
  1819.                 exit(LoadMacrosFromFile);
  1820.             end;
  1821.         err := SetFPos(f, fsFromStart, 0);
  1822.         err := fsRead(f, FileSize, ptr(MacroBufP));
  1823.         EndMacros := FileSize - 1;
  1824.         err := fsclose(f);
  1825.         LoadMacros2;
  1826.     end;
  1827.  
  1828.  
  1829.     procedure LoadMacrosFromWindow;
  1830.         var
  1831.             ByteCount: LongInt;
  1832.     begin
  1833.         if TextInfo <> nil then
  1834.             with TextInfo^ do begin
  1835.                     ByteCount := TextTE^^.TELength;
  1836.                     if ByteCount <= 0 then begin
  1837.                             PutMessage('Text window is empty.');
  1838.                             exit(LoadMacrosFromWindow);
  1839.                         end;
  1840.                     EndMacros := ByteCount - 1;
  1841.                     MacroBufP := MacroBufPtr(NewPtr(ByteCount));
  1842.                     if MacroBufP = nil then begin
  1843.                             PutMessage('Not enough memory to load macros.');
  1844.                             exit(LoadMacrosFromWindow);
  1845.                         end;
  1846.                     BlockMove(TextTE^^.hText^, ptr(MacroBufP), ByteCount);
  1847.                     LoadMacros2;
  1848.                 end;
  1849.     end;
  1850.  
  1851.  
  1852.     procedure LoadMacros;
  1853.         var
  1854.             name: str255;
  1855.     begin
  1856.         if CurrentWindow = TextKind then
  1857.             LoadMacrosFromWindow
  1858.         else if GetTextFile(name, MacrosRefNum) then
  1859.             LoadMacrosFromFile(name, MacrosRefNum);
  1860.     end;
  1861.  
  1862.  
  1863. end.